/* Created on 07/05/2005 */
package br.ufmg.dees.insane.ui.rich.learn.learn_view.model_view.command;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import br.ufmg.dees.insane.ui.rich.learn.learn_view.dialog.OutputTableDialog;

/** Uma classe para a interface grafica dos TPs 10 a 12 
 * resolu��o de sistemas lineares pelos m�todos:
 * Gauss, Gauss Escalonado e por invers�o de A.
 *  
 * @author Camara, Luciana
 * @since 07/05/2005
 * @version 1.0 */
public class ModelCompleteStiffnessPanel extends JPanel implements 
ActionListener, DocumentListener,TableModelListener
{ 
  private static final long serialVersionUID = 1L;

//componente para o titulo do trabalho 
  JLabel titulo;
  //componentes dos metodos
  //private ButtonGroup group;
  //private JRadioButton[] but= new JRadioButton[1];
  
  //componentes dos resultados
  private JTextArea quadroRes;
  //private JScrollPane painelRolagem;  
  
  //componentes de controle
  //private JButton salvaButton;
  //private JButton sairButton;
  
  
  //parametros das matrizes
  // matriz com os coeficientes do sistema
  private int ordem;  
  
  // parametros dos tabelas
  private JTable tableA;
  private JScrollPane scrollPaneTabelaA;
  //private MyTableModel tabelaModeloA;
  
  // paineis com matrizes
  private  JPanel painelMA, painelCentral2, painelCentral1, painel1, paineltitulo;
    
  
  //dimensoes da janela total
  private int larguraTotal;
  
  public ModelCompleteStiffnessPanel(){}
  /** Construtor do painel principal do Frame
   * @param w largura da janela escolhida
   * @param h altura da janela escolhida
   * @param opMetodos lista de metodos a ser exibida   */
  public ModelCompleteStiffnessPanel(int w,int h, int o, Object[][] K, OutputTableDialog dlg){
	  
  	ordem=o;
    this.larguraTotal=w;
    
//	 Cria painel titulo
	paineltitulo =new JPanel();	
	Border titled = BorderFactory.createEtchedBorder();	
	paineltitulo.setBorder(titled);
	titulo=new JLabel("MODEL COMPLETE STIFFNESS");
	titulo.setFont(new Font("SansSerif",Font.BOLD,14));
	paineltitulo.add(titulo);
	
	// cria o painel 
	painel1 = new JPanel();
	Border etched = BorderFactory.createEtchedBorder();
	titled = BorderFactory.createTitledBorder(etched,"Element Complete Stifness");
	painel1.setBorder(titled);
	GridBagLayout layout = new GridBagLayout();	
	GridBagConstraints configs = new GridBagConstraints();
	painel1.setLayout(layout);	
	configs.fill=GridBagConstraints.NONE;
	configs.anchor=GridBagConstraints.CENTER;
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical	
	//add(painel1,dlg.getMainPane(),configs,0,1,1,1); // ocupa 1 linha da grade
	add(painel1,dlg.getTablePane(),configs,0,1,1,1); // ocupa 1 linha da grade
	//System.out.println("mainpane= "+ dlg.getMainPane());
	//painel1.add(dlg.getMainPane());
	painel1.add(dlg.getTablePane());
	System.out.println("============================================");
	System.out.println("Cor do elemento E1"+ dlg.getTableColor("E1").toString());
	System.out.println("============================================");


//	Painel que engloba painel 1 a 3
	painelCentral1 =new JPanel();		
	painelCentral1.setLayout(layout); 
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral1,painel1,configs,0,0,1,4); // ocupa 1 coluna - 4 linhas	
	configs.weightx=100; configs.weighty=100; // vai esticar na horizontal
	
	// Painel para a matriz A
	//tabelaModeloA=new MyTableModel(matrizA,ordem,ordem);
	//tableA = new JTable(tabelaModeloA);
	int qlar=larguraTotal/2; int qalt=ordem*tableA.getRowHeight();
     tableA.setPreferredScrollableViewportSize(new Dimension(qlar+5, qalt+2));
     tableA.setEnabled(false);
     tableA.getModel().addTableModelListener(this);
     for (int i = 0; i < tableA.getColumnCount(); i++) {
       tableA.getColumnModel().getColumn(i).setMaxWidth(200);
       tableA.getColumnModel().getColumn(i).setMinWidth(30);
     }
     scrollPaneTabelaA = new JScrollPane(tableA);
     painelMA=new JPanel();
	titled = BorderFactory.createTitledBorder(etched,"Model Stiffnes");
	painelMA.setBorder(titled);
     painelMA.add(scrollPaneTabelaA);
     
	   
	
//	Painel que engloba os paines das matrizes
	painelCentral2 =new JPanel();		
	painelCentral2.setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // vai esticar na vertical e horizontal
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral2,painelMA,configs,0,1,2,5); // ocupa 2 colunas - 5 linhas	
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	
		
	// adiciona os paineis titulo, central e botoes ao content atual
	setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical	
	add(this,paineltitulo,configs,0,0,1,1); // ocupa 1 colunas,1 linha da grade
	configs.weightx=100; configs.weighty=100; // vai esticar na horizontal/vertical
	add(this,painelCentral1,configs,0,1,1,4); // ocupa 1 coluna, 4 linhas da grade
	configs.weightx=100; configs.weighty=100; // nao vai esticar na vertical
	add(this,painelCentral2,configs,0,5,1,5); // ocupa 1 coluna, 4 linhas da grade
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical
	
	
  }// fim de menuPanel-construtor
  
  public void setParametro(int p){
  	ordem = p;  	
  }
  
  public int getParametro(){
  	return ordem;  	
  }
   
  /** automatiza o posicionamento no layout GridBagLayout
   * @param j container a adicionar o componente
   * @param c componente a adicionar o elemento
   * @param gbc configuracoes do gridbaglayout
   * @param x coluna da grade
   * @param y linha da grade
   * @param w percentagem de esticamento em x
   * @param h percentagem de esticamento em y*/
  public void add(Container j, Component c, GridBagConstraints gbc, int x,int y, int w, int h){
    gbc.gridx=x;
    gbc.gridy=y;
    gbc.gridwidth=w;
    gbc.gridheight=h;
    j.add(c,gbc);
    //this.validaDados();
  }
  
   /** Metodo para tratamento de valores inseridos em JTextField
   * @param e DocumentEvent capturado   */
  public void insertUpdate (DocumentEvent e) {
    try {
      validaDados(); 
    }
    catch (Exception ex){
    quadroRes.setText(ex.getMessage());
    }
  }
  /** Metodo para tratamento de valores removidos em JTextField
   * @param e DocumentEvent capturado   */
  public void removeUpdate (DocumentEvent e) {validaDados(); }
  /** Metodo para tratamento de valores alterados em JTextField
   * @param e DocumentEvent capturado   */
  public void changedUpdate (DocumentEvent e) {validaDados(); }
  
  /** Metodo para validacao e conversao dos campos tipo texto 
   * dos parametros digitados pelo usuario */
  public void validaDados()
  {
         redimensionaSP();      
    }
   
  	
	/** executa o m�todo escolhido
	 * @param evt  objeto com o evento escolhido 	 */
	public void actionPerformed(ActionEvent evt) 
	{
	 	
	}// fim de actionPerformed
	
	
	/** @param n numero de espa�os 
	* @return  uma string com n espacos */
	public String espacos(int n){
	  if (n<2)n=2;
	  String esp="";
	  for (int i=0;i<n;i++) esp+=" ";
	  return esp;
	}

  	/* (non-Javadoc)
  	 * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent)
  	 */
  	public void tableChanged(TableModelEvent e) {
	    //int row = e.getFirstRow();
	    //int column = e.getColumn();
	    //MyTableModel model = (MyTableModel)e.getSource();	    
	   // Object data = model.getValueAt(row, column);
	    //String nomeModelo="";Double val=new Double(0);
	   // if (model==tabelaModeloA)matrizA[row][column-1]=(Double)data;	            
	    //quadroRes.setText(txt)
	  }
	
	
	
/** metodo para reinicializar uma matriz de objects 
 * @param va valor com o qual a matriz sera inicializado
* @return um matriz de ordemxordem reinicializada */
public Object[][] inicializaMatriz(double va){
  Double valor=new Double(va);
  Object[][] mat=new Object[ordem][ordem];
  for (int i=0;i<ordem;i++){
    for (int j=0;j<ordem;j++)mat[i][j]=(Object)valor;
  }
  return mat;  
}

/** metodo para reinicializar um vetor 
 * @param va valor com o qual o vetor sera inicializado
* @return um matriz de 1 coluna reinicializada */
public Object[][] inicializaVetor(double va){
  Double valor=new Double(va);
  Object[][] mat=new Object[ordem][1];
  for (int i=0;i<ordem;i++){
    mat[i][0]=(Object)valor;
  }
  return mat;  
}

/** Metodo para reinicializar o modelo de tabela 
 * @param mat nova matriz de objetos
* @param nc numero de colunas
* @param nl numero de linhas
* @return um novo modelo de tabela */
//public MyTableModel inicializaTabelaModelo(Object[][]mat,int nc,int nl){
 // MyTableModel tabModel=new MyTableModel(mat,nc,nl);
  //return tabModel;
//}

/** Metodo para redimensionar os scrollpanes de acordo como novos limites */
public void redimensionaSP(){
    int qlar=(int)(painelMA.getWidth()*0.9); 
    int qalt=ordem*tableA.getRowHeight();
    if (ordem>((int)(0.9*painelMA.getWidth()/30)-2)){
    tableA.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    for (int i = 0; i < tableA.getColumnCount(); i++) {
      tableA.getColumnModel().getColumn(i).setMaxWidth(40);
      tableA.getColumnModel().getColumn(i).setMinWidth(30);
    }
    qalt+=scrollPaneTabelaA.getHorizontalScrollBar().getHeight();
  }
  else {
    tableA.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    for (int i = 0; i < tableA.getColumnCount(); i++) {
      tableA.getColumnModel().getColumn(i).setMaxWidth(1000);
      tableA.getColumnModel().getColumn(i).setMinWidth(30);
      tableA.getColumnModel().getColumn(i).setPreferredWidth(75);
    }
  }
  // verifica se a altura nao ultrapassou o limite do painel   
  int limAltura=(int)(0.8*painelMA.getHeight());
  qalt+=tableA.getRowHeight()+5;
  if (qalt>limAltura) qalt=limAltura;  
  int qlarsp=(int)(0.9*qlar);
  tableA.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));  
  tableA.revalidate(); tableA.repaint();
  scrollPaneTabelaA.setSize(new Dimension(qlarsp,qalt));
  scrollPaneTabelaA.revalidate(); scrollPaneTabelaA.repaint();
  
}
  
}// fim de MenuPanel



